读书笔记《Objective C Programming - The Big Nerd Ranch Guide》Chapter 24 to 30

Chapter 24 Collection Classes

生词

1
2
delve-钻研,挖掘    solar-太阳光浴室,太阳的    ascending-上升    predicate-断言    discard-抛弃
Wrap-包裹 primitive-原始的 extract-提取 scalar-纯量

  1. NSSet 没有顺序的集合,每隔项只能出现一次,用来查询某项是否在该集合中;
  2. Equal和identical
  3. NSDictionary保存key-value对,通过key可以返回value,这些key-value对没有顺序;
    但是一个key只能对应一个value,如果给key再加一个value那么原先的value就会被覆盖。
    声明一个NSDictionary的语法:
    NSDictionary *numberOfMoons = @{ @"Earth" : @1, @"Mars" : @2, @"Venus" : @0,};
    书上告诉我,keys是 NSString,Values are NSNumber, 可是你根本就没有声明过这两种类型啊?
    下面这种方式,keys是NSString,Values 是 NSArray:
    1
    2
    3
    4
    NSDictionary *innerPlanetsMoons = @{
    @"Mercury" : @[],
    @"Earth" : @[ @"Luna"],
    @"Mars" : @[ @"Deimos", @"Photos"]};

好吧,我还是没搞明白,keys和values的类型到底是怎么确定的,接着看吧,找到答案再写。
搞明白咯: @[],@1,这些都是字面语法方式,本身就表示创建一个object,并返回object地址;
比如之前NSArray创建的例子:
NSArray *datalist = @[now,tomorrow,yesterday];

  1. 关于不可变的一些类:immutable objects,他们不需要被copy,所以可以提高效率,节省内存;
    可变的对象由于可能当前代码正在使用一个object的时候,别的代码改变了当对象的某些值,所以有很多copy同时存在内存中。
    这点我不是很理解,书中没有详细讲清楚这种copy机制,比如说copy机制最后如何生效,如果一个object有N个copy,
    那么到底哪个copy才是该真正起作用的呢?好吧,暂时没有接触到,后面找到答案再写。

  2. 排序: 首先生成一些排序描述对象,然后使用sortUsingDescriptors方法排序:

    1
    2
    3
    4
    5
    NSSortDescriptor *voa = [NSSortDescriptor sortDescriptorWithKey:@"valueOfAssets"
    ascending: YES];
    NSSortDescriptor *eid = [NSSortDescriptor sortDescriptorWithKey:@"employeeID"
    ascending: YES];
    [employees sortUsingDescriptors: @[voa,eid]];
  3. 过滤: 首先生曾一个过滤器,然后使用filterUsingPredicate方法来过滤NSMutableArray,
    由于NSArray是没办法删除或加入新对象的,所以过滤的工作只能通过生成一个新的Array来完成:

    1
    2
    NSPredicate *predicate = [NSPredicate pridicateWithFormat: @"holder.valueOfAssets > 70"];
    NSArray *toBeReclaimed = [allAssets filteredArrayUsingPredicate: predicate];
  4. 集合只能包含对象,不能包含C语言原始类型,比如整数,但是可以用NSNumber做一个包装再放入集合

  5. 集合中不能包含nil,有一个类叫做NSNull,代表什么也没有,[hotel addObject:[NSNull null]];

Chapter 25 Constants

生词

1
2
clutter-杂乱,混乱    geographical-地里的    blender-搅拌机    stir-搅拌
liquefy-液化

  1. 快捷键Command+变量 转到定义处
  2. etern means “I promise this exists, but it will be defined in some other file.”
  3. NS_ENUM()是一个预定义的宏,最大优势是可以指定枚举变量的类型,节省空间;
  4. 既然已经有了#defined 来定义常量,为什么还要使用全局变量来定义常量呢?
    因为在一些场合,全局变量更加搞笑,比如对比字符串的时候,== 比 isEqual更高效;
    而且使用全局变量更容易仿真。所以一般应该使用常量或者全局变量来定义枚举或常量而不是用#define

Chapter 26 Writing Files with NSString and NSData

生词

1
incredible-难以置信的

  1. 读写文件需要先定义好文件字符编码格式,比如ASCII定义’A’为01000001; UTF-16定义’A’为00000000 01000001;
  2. Fundation框架支持大约20种编码格式,一般常用UTF-8;
  3. NSError:In essence, you are passing the address of another address(which may become the address of an NSError object)

Chapter 27 Callbacks

生词

1
synchronous-同步的    asynchronous-异步的    demand-需求    crdential-证书    fluke-侥幸

  1. 四种类型的callback: Target-action; Helper objects; Notification; Blocks.
  2. NSRunLoop: 在一个事件驱动的程序里,需要有一个对象来等待事件发生,我们说当事件发生的时候,Runloop 引起一个callback的发生.
  3. 一段target-action类型callback的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main (int argc, const char *argv[])
    {
    @autoreleasepool{
    BNRLogger *logger = [[BNRLogger alloc] init];
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 2.0
    target:logger
    selector: @selector (updateLastTime:)
    userInfo: nil
    repeats: YES];
    [[NSRunLoop currentRunLoop] run];
    }
    return 0;
    }
  4. 同步取URL数据有两个问题:获取数据的过程中阻碍了主进程的执行,界面可能会卡住;如果服务器需要用户名和密码的话,没办法回调.

  5. 这种情况下,需要用helper object来处理这种困难的通信相关事件.
  6. objects只对一件事情回应,使用target-action;对类似于通信的,使用helper object代理;可能需要对很多别的object产生的时间回应,使用Notifications.
  7. 向一个对象发送消息之后,对象要按照继承关系一层一层向上索引,知道找到该方法;如果用方法名来索引就太慢了,所以编译器用数字为每一个方法编号,通过编号索引.
    还是不理解selector,之后再查找补充;

Chapter 28 Blocks

生词

1
2
caret-记号,符号    anonymous-匿名的    elegant-高雅的,简洁的    iterate-迭代    compose-组成,排版
nuance-细微差别

  1. 许多apple的calss方法接受block作为参数;比如NSArray等,会对这个arry中的每个对象执行block代码.
  2. 不明白block和方法的区别;看资料暂时理解为如果需要传递一个函数作为参数,就使用block;
  3. 无名block,无名参数传递等 anonymous
  4. block使用外部变量,私有变量在block里存一份copy,指针会在block里保存强引用; (If you have been wondering
    about the difference between blocks and function pointers, it is right here)
  5. 在block内使用self strong local reference :By creating the strong innerSelfreference, you have again created a strong reference cycle between
    the block and the BNREmployeeinstance. But because the innerSelfreference is local to the scope of
    the block, the strong reference cycle will only exist while the block is executing and will be broken
    automatically when the block ends.
  6. 默认block里无法改变外部变量的值,只有将外部变量加_block关键字

Chapter 29 Protocols

生词

1
stern-尾端,严厉的

  1. Protocol定义一组方法声明,其中一些是必须实现的,另一些选择实现;
  2. Protocol可以继承;
  3. 如果向一个对象发送一个没有应用的消息,程序会崩溃,所以再发送optional消息时候要先问一下;

Chapter 30 Property Lists

生词


  1. 属性列表,没用过还是不理解妙处,看来必须实际去用才理解记忆深刻.看完本书就开始搞我的第一个APP。